<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>significant_terms 演示 | Elasticsearch: 权威指南 | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch: 权威指南">
<link rel="up" href="significant-terms.html" title="通过聚合发现异常指标">
<link rel="prev" href="significant-terms.html" title="通过聚合发现异常指标">
<link rel="next" href="docvalues-and-fielddata.html" title="Doc Values and Fielddata">
<meta name="DC.type" content="Learn/Docs/Elasticsearch/Definitive Guide">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="2.x">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="zh_cn">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="aggregations.html">聚合</a></span>
»
<span class="breadcrumb-link"><a href="significant-terms.html">通过聚合发现异常指标</a></span>
»
<span class="breadcrumb-node">significant_terms 演示</span>
</div>
<div class="navheader">
<span class="prev">
<a href="significant-terms.html">« 通过聚合发现异常指标</a>
</span>
<span class="next">
<a href="docvalues-and-fielddata.html">Doc Values and Fielddata »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="_significant_terms_demo"></a>significant_terms 演示<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/300_Aggregations/75_sigterms.asciidoc">edit</a>
</h2>
</div></div></div>
<p>因为 <code class="literal">significant_terms</code> 聚合 是通过分析统计信息来工作的，
需要为数据设置一个阀值让它们更有效。也就是说无法通过只索引少量示例数据来展示它。</p>
<p>正因如此，我们准备了一个大约 8000 个文档的数据集，并将它的快照保存在一个公共演示库中。可以通过以下步骤在集群中还原这些数据：</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
<p>在 <code class="literal">elasticsearch.yml</code> 配置文件中增加以下配置，
以便将演示库加入到白名单中：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">repositories.url.allowed_urls: ["http://download.elastic.co/*"]</pre>
</div>
</li>
<li class="listitem">
重启 Elasticsearch。
</li>
<li class="listitem">
<p>运行以下快照命令。（更多使用快照的信息，参见 <a class="xref" href="backing-up-your-cluster.html" title="备份你的集群">备份集群（Backing Up Your Cluster）</a>）。</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">PUT /_snapshot/sigterms <a id="CO209-1"></a><i class="conum" data-value="1"></i>
{
    "type": "url",
    "settings": {
        "url": "http://download.elastic.co/definitiveguide/sigterms_demo/"
    }
}

GET /_snapshot/sigterms/_all <a id="CO209-2"></a><i class="conum" data-value="2"></i>

POST /_snapshot/sigterms/snapshot/_restore <a id="CO209-3"></a><i class="conum" data-value="3"></i>

GET /mlmovies,mlratings/_recovery <a id="CO209-4"></a><i class="conum" data-value="4"></i></pre>
</div>
<div class="sense_widget" data-snippet="snippets/300_Aggregations/75_sigterms.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO209-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>注册一个新的只读地址库，并指向演示快照。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO209-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>（可选）检查库内关于快照的详细信息。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO209-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>开始还原过程。会在集群中创建两个索引： <code class="literal">mlmovies</code> 和 <code class="literal">mlratings</code> 。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO209-4"><i class="conum" data-value="4"></i></a></p>
</td>
<td align="left" valign="top">
<p>（可选）使用 Recovery API 监控还原过程。</p>
</td>
</tr>
</table>
</div>
</li>
</ol>
</div>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>数据集有 50 MB 会需要一些时间下载。</p>
</div>
</div>
<p>在本演示中，会看看 MovieLens 里面用户对电影的评分。在 MovieLens 里，用户可以推荐电影并评分，这样其他用户也可以找到新的电影。
为了演示，会基于输入的电影采用 <code class="literal">significant_terms</code> 对电影进行推荐。</p>
<p>让我们看看示例中的数据，感受一下要处理的内容。本数据集有两个索引， <code class="literal">mlmovies</code> 和 <code class="literal">mlratings</code> 。首先查看 <code class="literal">mlmovies</code> ：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET mlmovies/_search <a id="CO210-1"></a><i class="conum" data-value="1"></i>

{
   "took": 4,
   "timed_out": false,
   "_shards": {...},
   "hits": {
      "total": 10681,
      "max_score": 1,
      "hits": [
         {
            "_index": "mlmovies",
            "_type": "mlmovie",
            "_id": "2",
            "_score": 1,
            "_source": {
               "offset": 2,
               "bytes": 34,
               "title": "Jumanji (1995)"
            }
         },
         ....</pre>
</div>
<div class="sense_widget" data-snippet="snippets/300_Aggregations/75_sigterms.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO210-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>执行一个不带查询条件的搜索，以便能看到一组随机演示文档。</p>
</td>
</tr>
</table>
</div>
<p><code class="literal">mlmovies</code> 里的每个文档表示一个电影，数据有两个重要字段：电影ID <code class="literal">_id</code> 和电影名 <code class="literal">title</code> 。可以忽略
<code class="literal">offset</code> 和 <code class="literal">bytes</code> 。它们是从原始 CSV 文件抽取数据的过程中产生的中间属性。数据集中有 10，681 部影片。</p>
<p>现在来看看 <code class="literal">mlratings</code> ：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET mlratings/_search

{
   "took": 3,
   "timed_out": false,
   "_shards": {...},
   "hits": {
      "total": 69796,
      "max_score": 1,
      "hits": [
         {
            "_index": "mlratings",
            "_type": "mlrating",
            "_id": "00IC-2jDQFiQkpD6vhbFYA",
            "_score": 1,
            "_source": {
               "offset": 1,
               "bytes": 108,
               "movie": [122,185,231,292,
                  316,329,355,356,362,364,370,377,420,
                  466,480,520,539,586,588,589,594,616
               ],
               "user": 1
            }
         },
         ...</pre>
</div>
<div class="sense_widget" data-snippet="snippets/300_Aggregations/75_sigterms.json"></div>
<p>这里可以看到每个用户的推荐信息。每个文档表示一个用户，用 ID 字段 <code class="literal">user</code> 来表示， <code class="literal">movie</code> 字段维护一个用户观看和推荐过的影片列表。</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_基于流行程度推荐recommending_based_on_popularity"></a>基于流行程度推荐（Recommending Based on Popularity）<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/300_Aggregations/75_sigterms.asciidoc">edit</a>
</h3>
</div></div></div>
<p>可以采取的首个策略就是基于流行程度向用户推荐影片。
对于某部影片，找到所有推荐过它的用户，然后将他们的推荐进行聚合并获得推荐中最流行的五部。</p>
<p>我们可以很容易的通过一个 <code class="literal">terms</code> 聚合 以及一些过滤来表示它，看看 <em>Talladega Nights（塔拉迪加之夜）</em> 这部影片，它是 Will Ferrell 主演的一部关于全国运动汽车竞赛（NASCAR racing）的喜剧。
在理想情况下，我们的推荐应该找到类似风格的喜剧（很有可能也是 Will Ferrell 主演的）。</p>
<p>首先需要找到影片 <em>Talladega Nights</em> 的 ID：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET mlmovies/_search
{
  "query": {
    "match": {
      "title": "Talladega Nights"
    }
  }
}

    ...
    "hits": [
     {
        "_index": "mlmovies",
        "_type": "mlmovie",
        "_id": "46970", <a id="CO211-1"></a><i class="conum" data-value="1"></i>
        "_score": 3.658795,
        "_source": {
           "offset": 9575,
           "bytes": 74,
           "title": "Talladega Nights: The Ballad of Ricky Bobby (2006)"
        }
     },
    ...</pre>
</div>
<div class="sense_widget" data-snippet="snippets/300_Aggregations/75_sigterms.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO211-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p><em>Talladega Nights</em> 的 ID 是 <code class="literal">46970</code> 。</p>
</td>
</tr>
</table>
</div>
<p>有了 ID，可以过滤评分，再应用 <code class="literal">terms</code> 聚合从喜欢 <em>Talladega Nights</em> 的用户中找到最流行的影片：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET mlratings/_search
{
  "size" : 0, <a id="CO212-1"></a><i class="conum" data-value="1"></i>
  "query": {
    "filtered": {
      "filter": {
        "term": {
          "movie": 46970 <a id="CO212-2"></a><i class="conum" data-value="2"></i>
        }
      }
    }
  },
  "aggs": {
    "most_popular": {
      "terms": {
        "field": "movie", <a id="CO212-3"></a><i class="conum" data-value="3"></i>
        "size": 6
      }
    }
  }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/300_Aggregations/75_sigterms.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO212-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>这次查询 <code class="literal">mlratings</code> ， 将结果内容 <code class="literal">大小设置</code> 为 0 因为我们只对聚合的结果感兴趣。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO212-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>对影片 <em>Talladega Nights</em> 的 ID 使用过滤器。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO212-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>最后，使用 <code class="literal">terms</code> 桶找到最流行的影片。</p>
</td>
</tr>
</table>
</div>
<p>在 <code class="literal">mlratings</code>  索引下搜索，然后对影片 <em>Talladega Nights</em> 的 ID 使用过滤器。由于聚合是针对查询范围进行操作的，它可以有效的过滤聚合结果从而得到那些只推荐 <em>Talladega Nights</em> 的用户。
最后，执行  <code class="literal">terms</code> 聚合得到最流行的影片。
请求排名最前的六个结果，因为 <em>Talladega Nights</em> 本身很有可能就是其中一个结果（并不想重复推荐它）。</p>
<p>返回结果就像这样：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
...
   "aggregations": {
      "most_popular": {
         "buckets": [
            {
               "key": 46970,
               "key_as_string": "46970",
               "doc_count": 271
            },
            {
               "key": 2571,
               "key_as_string": "2571",
               "doc_count": 197
            },
            {
               "key": 318,
               "key_as_string": "318",
               "doc_count": 196
            },
            {
               "key": 296,
               "key_as_string": "296",
               "doc_count": 183
            },
            {
               "key": 2959,
               "key_as_string": "2959",
               "doc_count": 183
            },
            {
               "key": 260,
               "key_as_string": "260",
               "doc_count": 90
            }
         ]
      }
   }
...</pre>
</div>
<p>通过一个简单的过滤查询，将得到的结果转换成原始影片名：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET mlmovies/_search
{
  "query": {
    "filtered": {
      "filter": {
        "ids": {
          "values": [2571,318,296,2959,260]
        }
      }
    }
  }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/300_Aggregations/75_sigterms.json"></div>
<p>最后得到以下列表：</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
Matrix, The（黑客帝国）
</li>
<li class="listitem">
Shawshank Redemption（肖申克的救赎）
</li>
<li class="listitem">
Pulp Fiction（低俗小说）
</li>
<li class="listitem">
Fight Club（搏击俱乐部）
</li>
<li class="listitem">
Star Wars Episode IV: A New Hope（星球大战 IV：曙光乍现）
</li>
</ol>
</div>
<p>好吧，这肯定不是一个好的列表！我喜欢所有这些影片。但问题是：几乎 <em>每个人</em> 都喜欢它们。这些影片本来就受大众欢迎，也就是说它们出现在每个人的推荐中都会受欢迎。
这其实是一个流行影片的推荐列表，而不是和影片 <em>Talladega Nights</em> 相关的推荐。</p>
<p>可以通过再次运行聚合轻松验证，而不需要对影片 <em>Talladega Nights</em> 进行过滤。会提供最流行影片的前五名列表：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET mlratings/_search
{
  "size" : 0,
  "aggs": {
    "most_popular": {
      "terms": {
        "field": "movie",
        "size": 5
      }
    }
  }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/300_Aggregations/75_sigterms.json"></div>
<p>返回列表非常相似：</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
Shawshank Redemption（肖申克的救赎）
</li>
<li class="listitem">
Silence of the Lambs, The（沉默的羔羊）
</li>
<li class="listitem">
Pulp Fiction（低俗小说）
</li>
<li class="listitem">
Forrest Gump（阿甘正传）
</li>
<li class="listitem">
Star Wars Episode IV: A New Hope（星球大战 IV：曙光乍现）
</li>
</ol>
</div>
<p>显然，只是检查最流行的影片是不能足以创建一个良好而又具鉴别能力的推荐系统。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_基于统计的推荐recommending_based_on_statistics"></a>基于统计的推荐（Recommending Based on Statistics）<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/300_Aggregations/75_sigterms.asciidoc">edit</a>
</h3>
</div></div></div>
<p>现在场景已经设定好，使用 <code class="literal">significant_terms</code> 。 <code class="literal">significant_terms</code> 会分析喜欢影片 <em>Talladega Nights</em> 的用户组（ <em>前端</em> 用户组），并且确定最流行的电影。
 然后为每个用户（ <em>后端</em> 用户）构造一个流行影片列表，最后将两者进行比较。</p>
<p>统计异常就是与统计背景相比在前景特征组中过度展现的那些影片。理论上讲，它应该是一组喜剧，因为喜欢 Will Ferrell 喜剧的人给这些影片的评分会比一般人高。</p>
<p>让我们试一下：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET mlratings/_search
{
  "size" : 0,
  "query": {
    "filtered": {
      "filter": {
        "term": {
          "movie": 46970
        }
      }
    }
  },
  "aggs": {
    "most_sig": {
      "significant_terms": { <a id="CO213-1"></a><i class="conum" data-value="1"></i>
        "field": "movie",
        "size": 6
      }
    }
  }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/300_Aggregations/75_sigterms.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO213-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>设置几乎一模一样，只是用 <code class="literal">significant_terms</code> 替代了 <code class="literal">terms</code> 。</p>
</td>
</tr>
</table>
</div>
<p>正如所见，查询也几乎是一样的。过滤出喜欢影片 <em>Talladega Nights</em> 的用户，他们组成了前景特征用户组。默认情况下，
<code class="literal">significant_terms</code>  会使用整个索引里的数据作为统计背景，所以不需要特别的处理。</p>
<p>与 <code class="literal">terms</code> 类似，结果返回了一组桶，不过有更多的元数据信息：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">...
   "aggregations": {
      "most_sig": {
         "doc_count": 271, <a id="CO214-1"></a><i class="conum" data-value="1"></i>
         "buckets": [
            {
               "key": 46970,
               "key_as_string": "46970",
               "doc_count": 271,
               "score": 256.549815498155,
               "bg_count": 271
            },
            {
               "key": 52245, <a id="CO214-2"></a><i class="conum" data-value="2"></i>
               "key_as_string": "52245",
               "doc_count": 59, <a id="CO214-3"></a><i class="conum" data-value="3"></i>
               "score": 17.66462367106966,
               "bg_count": 185 <a id="CO214-4"></a><i class="conum" data-value="4"></i>
            },
            {
               "key": 8641,
               "key_as_string": "8641",
               "doc_count": 107,
               "score": 13.884387742677438,
               "bg_count": 762
            },
            {
               "key": 58156,
               "key_as_string": "58156",
               "doc_count": 17,
               "score": 9.746428133759462,
               "bg_count": 28
            },
            {
               "key": 52973,
               "key_as_string": "52973",
               "doc_count": 95,
               "score": 9.65770100311672,
               "bg_count": 857
            },
            {
               "key": 35836,
               "key_as_string": "35836",
               "doc_count": 128,
               "score": 9.199001116457955,
               "bg_count": 1610
            }
         ]
 ...</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO214-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>顶层 <code class="literal">doc_count</code> 展现了前景特征组里文档的数量。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO214-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>每个桶里面列出了聚合的键值（例如，影片的ID）。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO214-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>桶内文档的数量 <code class="literal">doc_count</code> 。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO214-4"><i class="conum" data-value="4"></i></a></p>
</td>
<td align="left" valign="top">
<p>背景文档的数量，表示该值在整个统计背景里出现的频度。</p>
</td>
</tr>
</table>
</div>
<p>可以看到，获得的第一个桶是 <em>Talladega Nights</em> 。它可以在所有 271 个文档中找到，这并不意外。让我们看下一个桶：键值 <code class="literal">52245</code> 。</p>
<p>这个 ID 对应影片 <em>Blades of Glory（荣誉之刃）</em> ，它是一部关于男子学习滑冰的喜剧，也是由 Will Ferrell 主演。可以看到喜欢 <em>Talladega Nights</em> 的用户对它的推荐是 59 次。
这也意味着 21% 的前景特征用户组推荐了影片 <em>Blades of Glory</em> （ <code class="literal">59 / 271 = 0.2177</code> ）。</p>
<p>形成对比的是， <em>Blades of Glory</em> 在整个数据集合中仅被推荐了 185 次，
只占 0.26% （ <code class="literal">185 / 69796 = 0.00265</code> ）。因此 <em>Blades of Glory</em> 是一个统计异常：它在喜欢 <em>Talladega Nights</em> 的用户中是显著的共性（注：uncommonly common）。这样就找到了一个好的推荐！</p>
<p>如果看完整的列表，它们都是好的喜剧推荐（其中很多也是由 Will Ferrell 主演）：</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
Blades of Glory（荣誉之刃）
</li>
<li class="listitem">
Anchorman: The Legend of Ron Burgundy（王牌播音员）
</li>
<li class="listitem">
Semi-Pro（半职业选手）
</li>
<li class="listitem">
Knocked Up（一夜大肚）
</li>
<li class="listitem">
40-Year-Old Virgin, The（四十岁的老处男）
</li>
</ol>
</div>
<p>这只是 <code class="literal">significant_terms</code> 它强大的一个示例，一旦开始使用 <code class="literal">significant_terms</code> ，可能碰到这样的情况，我们不想要最流行的，而想要显著的共性（注：uncommonly common）。这个简单的聚合可以揭示出一些数据里出人意料的复杂趋势。</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="significant-terms.html">« 通过聚合发现异常指标</a>
</span>
<span class="next">
<a href="docvalues-and-fielddata.html">Doc Values and Fielddata »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
